package com.study.compose.coroutines

import kotlinx.coroutines.TimeoutCancellationException
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeout

/**
 * 超时
 * 实际场景中，大多数取消协程的理由是超时取消
 */
fun main() = runBlocking {
    /**
     * 协程提供了withTimeout函数，来定义超时取消协程,
     * 在协程取消的时候会抛出TimeoutCancellationException异常，因为withTimeout取消协程不被认为是一个协程结束的正常原因，
     * 因为这样取消只是一个例外，我们需要执行一些其他操作，确保我们的程序正常运行
     *
     */
    try {
        withTimeout(10000) {
            repeat(1000) {
                delay(1000)
                println("快一点，到点了")
            }
        }
    } catch (e: TimeoutCancellationException) {
        println("不好意思，服务已被终止")
    }

    /**
     * 或者使用withTimeoutOrNull(10000)方法，在协程执行结束的时候会返回一个结果，如果因为超时结束会返回null
     */
}